﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualBasic;

namespace ESMOffline.Data
{

    class CSincronizacion : ISincronizacion
    {

        #region Propiedades Publicas y Privadas

        protected ESM_SincDataContext objESM_SincDataContext = new ESM_SincDataContext();
        protected CConexion objCConexion = new CConexion();
        protected ESMDataSet objESMDataSet = new ESMDataSet();

        #endregion
        /// <summary>
        /// Obtiene la coleccion de los registros correspondientes a la tabla Resultados que estan marcados como actualizados,
        /// y los envia a la base de datos del servidor.
        /// </summary>
        /// <returns>Valor que indica si la tansacción termino con éxito.</returns>
        public bool getActualizados_dboResultados()
        {
            try
            {
                var ds_Resultados = objESMDataSet.dbo_Resultados;
                var da_Resultados = new ESMDataSetTableAdapters.dbo_ResultadosTableAdapter();

                da_Resultados.Fill(ds_Resultados);

                var resultados_actualizados = from r in ds_Resultados
                                              where r.Update == true
                                              select r;

                foreach (var item in resultados_actualizados)
                {
                    var resultado_actualizar = (from r_to_a in objESM_SincDataContext.Resultados
                                                where r_to_a.IdResultados == item.IdResultados
                                                select r_to_a).Single();

                    if (item.Valor == "-1")
                        resultado_actualizar.Valor = true;
                    else if (item.Valor == "0")
                        resultado_actualizar.Valor = false;

                    resultado_actualizar.Pendiente = item.Pendiente;
                    resultado_actualizar.Sesiones = item.Sesiones;

                    objESM_SincDataContext.SubmitChanges();
                }

                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        /// <summary>
        /// Obtiene la coleccion de los registros correspondientes a la tabla ResultadosByEvaluacion que estan marcados como actualizados,
        /// y los envia a la base de datos del servidor.
        /// </summary>
        /// <returns>Valor que indica si la tansacción termino con éxito</returns>
        public bool getActualizados_dboResultadosByEvaluacion()
        {
            try
            {
                var ds_ResultadosByEvaluacion = objESMDataSet.dbo_ResultadosByEvaluacion;
                var da_ResultadosByEvaluacion = new ESMDataSetTableAdapters.dbo_ResultadosByEvaluacionTableAdapter();

                da_ResultadosByEvaluacion.Fill(ds_ResultadosByEvaluacion);

                var resultadosbyevaluacion_actualizados = from r in ds_ResultadosByEvaluacion
                                                          where r.Update == true
                                                          select r;

                foreach (var item in resultadosbyevaluacion_actualizados)
                {
                    var resultadobyevaluacion_actualizar = (from rbe_to_a in objESM_SincDataContext.ResultadosByEvaluacions
                                                            where rbe_to_a.IdResultado == item.IdResultado
                                                            select rbe_to_a).Single();

                    resultadobyevaluacion_actualizar.IdResultado = item.IdResultado;
                    resultadobyevaluacion_actualizar.IdEvaluacion = item.IdEvaluacion;

                    objESM_SincDataContext.SubmitChanges();
                }

                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        /// <summary>
        /// Obtiene la colección de los registros correspondientes a la tabla Evaluación que están marcados como actualizados,
        /// y los envía a la base de datos del servidor.
        /// </summary>
        /// <returns>Valor que indica si la transacción termino con éxito</returns>
        public bool getActualizados_dboEvaluacion()
        {
            try
            {
                var ds_Evaluacion = objESMDataSet.dbo_Evaluacion;
                var da_Evaluacion = new ESMDataSetTableAdapters.dbo_EvaluacionTableAdapter();

                da_Evaluacion.Fill(ds_Evaluacion);

                var evaluacion_actualizados = from r in ds_Evaluacion
                                              where r.Update == true
                                              select r;

                foreach (var item in evaluacion_actualizados)
                {
                    var evaluacion_actualizar = (from e_to_a in objESM_SincDataContext.Evaluacions
                                                 where e_to_a.IdEvaluacion == item.IdEvaluacion
                                                 select e_to_a).Single();

                    evaluacion_actualizar.IdIE = item.IdIE;
                    evaluacion_actualizar.IdActor = item.IdActor;
                    evaluacion_actualizar.Fecha = item.Fecha;
                    evaluacion_actualizar.IdUsuario = item.IdUsuario;
                    evaluacion_actualizar.IdEstado = item.IdEstado;
                    evaluacion_actualizar.IdMedicion = item.IdMedicion;

                    objESM_SincDataContext.SubmitChanges();
                }

                return true;
            }
            catch (Exception)
            {
                return false;
            }
        }
        /// <summary>
        /// Obtiene el total de los registros en el servidor, almacenandolos en las tablas locales (Resultados).
        /// </summary>
        /// <returns>Valor que indica si la tansacción termino con éxito</returns>
        public bool getServer_dboResultados()
        {
            try
            {
                var resultados_server = from r in objESM_SincDataContext.Resultados
                                        select r;

                string reset_Resultados = "DELETE FROM dbo_Resultados";
                string insert_Resultados_Server = "";
                objCConexion.Conectar();
                objCConexion.Ejecutar(reset_Resultados);
                objCConexion.Desconectar();

                objCConexion.Conectar();
                foreach (var item in resultados_server)
                {
                    insert_Resultados_Server = String.Format("INSERT INTO dbo_Resultados (IdResultados, IdPregunta, Valor, Pendiente, Sesiones) VALUES ({0}, {1}, {2}, {3}, {4})", item.IdResultados == 0 ? "NULL" : item.IdResultados.ToString(), item.IdPregunta == 0 ? "NULL" : item.IdPregunta.ToString(), item.Valor == null ? "NULL" : item.Valor.ToString(), item.Pendiente == null ? "NULL" : item.Pendiente.ToString(), item.Sesiones == null ? "NULL" : item.Sesiones.ToString());
                    objCConexion.Ejecutar(insert_Resultados_Server);
                }
                objCConexion.Desconectar();
                return true;
            }
            catch (Exception)
            {
                objCConexion.Desconectar();
                return false;
            }
        }
        /// <summary>
        /// Obtiene el total de los registros en el servidor, almacenandolos en las tablas locales (ResultadosByEvaluacion).
        /// </summary>
        /// <returns>Valor que indica si la tansacción termino con éxito</returns>
        public bool getServer_dboResultadosByEvaluacion()
        {
            try
            {
                var resultadosbyevaluacion_server = from rbe in objESM_SincDataContext.ResultadosByEvaluacions
                                                    select rbe;

                string reset_ResultadosByEvaluacion = "DELETE FROM dbo_ResultadosByEvaluacion";
                string insert_ResultadosByEvaluacion_Server = "";
                objCConexion.Conectar();
                objCConexion.Ejecutar(reset_ResultadosByEvaluacion);
                objCConexion.Desconectar();

                objCConexion.Conectar();
                foreach (var item in resultadosbyevaluacion_server)
                {
                    insert_ResultadosByEvaluacion_Server = String.Format("INSERT INTO dbo_ResultadosByEvaluacion (IdResultadosbyPregunta, IdResultado, IdEvaluacion) VALUES ({0}, {1}, {2})", item.IdResultadosbyPregunta, item.IdResultado, item.IdEvaluacion);
                    objCConexion.Ejecutar(insert_ResultadosByEvaluacion_Server);
                }
                objCConexion.Desconectar();
                return true;
            }
            catch (Exception)
            {
                objCConexion.Desconectar();
                return false;
            }
        }
        /// <summary>
        /// Obtiene el total de los registros en el servidor, almacenandolos en las tablas locales (Evaluacion).
        /// </summary>
        /// <returns>Valor que indica si la tansacción termino con éxito</returns>
        public bool getServer_dboEvaluacion()
        {
            try
            {
                var evaluacion_server = from e in objESM_SincDataContext.Evaluacions
                                        select e;

                string reset_Evaluacion = "DELETE FROM dbo_Evaluacion";
                string insert_Evaluacion_Server = "";
                objCConexion.Conectar();
                objCConexion.Ejecutar(reset_Evaluacion);
                objCConexion.Desconectar();

                objCConexion.Conectar();
                foreach (var item in evaluacion_server)
                {
                    insert_Evaluacion_Server = String.Format("INSERT INTO dbo_Evaluacion (IdEvaluacion, IdIE, IdActor, Fecha, IdUsuario, IdEstado, IdMedicion, IdSE) VALUES ({0}, {1}, {2}, '{3}', {4}, {5}, {6}, {7})", item.IdEvaluacion, item.IdIE, item.IdActor, item.Fecha.ToShortDateString(), item.IdUsuario, item.IdEstado, item.IdMedicion, "NULL");
                    objCConexion.Ejecutar(insert_Evaluacion_Server);
                }
                objCConexion.Desconectar();
                return true;
            }
            catch (Exception)
            {
                objCConexion.Desconectar();
                return false;
            }
        }
    }
}
